約 2,895,614 件
https://w.atwiki.jp/opengl/pages/147.html
平行移動と同じようにして拡大縮小も線形補間してみました。 新規に作成した sample3.x を表示しています。 font.h #pragma once class GLFONT { public HFONT Hfont; HDC Hdc; GLFONT(wchar_t *fontname, int size); void DrawStringW(int x,int y,wchar_t *format, ...); }; //コンストラクタ フォント作成 GLFONT GLFONT(wchar_t *fontname, int size) { Hfont = CreateFontW( size, //フォント高さ 0, //文字幅 0, //テキストの角度 0, //ベースラインとx軸との角度 FW_REGULAR, //フォントの太さ FALSE, //イタリック体 FALSE, //アンダーライン FALSE, //打ち消し線 SHIFTJIS_CHARSET, //文字セット OUT_DEFAULT_PRECIS, //出力精度 CLIP_DEFAULT_PRECIS, //クリッピング精度 ANTIALIASED_QUALITY, //出力品質 FIXED_PITCH | FF_MODERN, //ピッチとファミリー fontname); //書体名 Hdc = wglGetCurrentDC(); SelectObject(Hdc, Hfont); } //ワイド文字列の描画 void GLFONT DrawStringW(int x,int y,wchar_t *format, ...) { wchar_t buf[256]; va_list ap; int Length=0; int list=0; //ポインタがNULLの場合は終了 if ( format == NULL ) return; //文字列変換 va_start(ap, format); vswprintf_s(buf, format, ap); va_end(ap); Length = wcslen(buf); list = glGenLists(Length); for( int i=0; i wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i); } glDisable(GL_LIGHTING); glRasterPos2i(x, y); //ディスプレイリストで描画 for( int i=0; i { glCallList(list + i); } glEnable(GL_LIGHTING); //ディスプレイリスト破棄 glDeleteLists(list, Length); list = 0; Length = 0; } PNG.h #pragma once #include lodepng.h //テクスチャクラス class TEXTURE{ protected LodePNG_Decoder decoder;//デコーダ unsigned char* buffer;//バッファ size_t buffersize, imagesize;//サイズ public TEXTURE(); TEXTURE(const char* FileName);//コンストラクタ void LOAD_PNG(const char* FileName);//PNG読み込み unsigned char* image;//イメージポインタ unsigned int Width,Height;//画像サイズ }; TEXTURE TEXTURE(){ } TEXTURE TEXTURE(const char* FileName){ LOAD_PNG(FileName); } void TEXTURE LOAD_PNG(const char* FileName){ LodePNG_Decoder_init( decoder); //ロード LodePNG_loadFile( buffer, buffersize, FileName); //デコード LodePNG_decode( decoder, image, imagesize, buffer, buffersize); //幅,高さ Width = decoder.infoPng.width;Height = decoder.infoPng.height; } xfile.h #pragma once #include PNG.h using namespace std; //マトリクス構造体 struct MATRIX { union { struct { float _11, _12, _13, _14; float _21, _22, _23, _24; float _31, _32, _33, _34; float _41, _42, _43, _44; }; float mat_4x4[4][4]; float mat_16[16]; }; MATRIX(){//単位行列に初期化 for(int i=0;i 16;i++){ this- mat_16[i]=0; } this- _11=this- _22=this- _33=this- _44=1; } }; //3つのベクトル struct Vector3f{ float x; float y; float z; }vec3d; Vector3f operator*(Vector3f v,float size){ v.x *= size; v.y *= size; v.z *= size; return v; } Vector3f operator+(Vector3f a,Vector3f b){ a.x+=b.x; a.y+=b.y; a.z+=b.z; return a; } //4つのベクトル struct Vector4f{ float x; float y; float z; float w; }vec4d; //4つのカラー struct Color4{ float r; float g; float b; float a; }; //4つの反射 struct Reflection4{ Color4 diffuse; Color4 ambient; Color4 emission; Color4 specular; }; //UV座標 struct UV{ float u;//u値 float v;//v値 }vec2d; //ポリゴンデータ struct Triangle{ Vector3f TriVer; Vector3f TriNor; UV TriUV; }Tri; //ポリゴンデータ struct Quadrangle{ Vector3f QuadVer; Vector3f QuadNor; UV QuadUV; }Quad; //マテリアル構造体 struct MATERIAL{ string MaterialName;//マテリアル名 Reflection4 MaterialColor;//反射 float Shininess;//shininess string TextureName;//テクスチャ名 int TexNo;//テクスチャNO. vector Tridata;//三角面データ vector Quaddata;//四角面データ }mtl; //メッシュ構造体 struct MESH{ public vector Material;//マテリアル vector TexData;//テクスチャデータ vector TexID;//テクスチャID GLuint TexID2;//代入用 TEXTURE* tex;//代入用 }msh; //アニメーションデータ構造体 struct ANIMATION{ public vector Key;//アニメーションキー vector Matrix;//行列データ }anm; //ノード構造体 struct NODE{ NODE* Node;//子ノード NODE* Next;//隣の階層 string FrameName;//フレーム名 MESH* Mesh;//メッシュ ANIMATION Anim;//アニメーションデータ }nde; //階層メッシュクラス class HIERARCHY{ public void Draw();//描画 void Draw_Frame(NODE node,int Frame_Time);//フレーム描画 void Animation_Draw(int Animation_NO,int Frame);//アニメーション描画 HIERARCHY(); HIERARCHY(char* FileName,int size); NODE Root;//ルートノード int Size;//サイズ int Animation_MaxFrame;//最大フレーム private bool Load_Hierarchy(char* FileName); //階層メッシュ読み込み void Find_Frame(NODE node,char* name);//フレームを探す bool Load_Frame(FILE fp,NODE node,int hierarchy); //フレーム読み込み bool Load_Mesh(FILE fp,NODE node);//メッシュ読み込み bool Load_Animation(FILE fp);//アニメーション読み込み MATRIX Linear_Interpolation(MATRIX a,MATRIX b,float t);//線形補間 void Init(); char buffer[255]; int Back;//階層戻し NODE* pNode;//ノードポインタ }; //コンストラクタ HIERARCHY HIERARCHY(){ Init(); } //コンストラクタ HIERARCHY HIERARCHY(char* FileName,int size){ Init(); Size=size; Load_Hierarchy(FileName); } //初期化 void HIERARCHY Init(){ Root.Node=NULL; Root.Next=NULL; Root.FrameName= Root ; Root.Mesh=NULL; } //線形補間 MATRIX HIERARCHY Linear_Interpolation(MATRIX a,MATRIX b,float t){ MATRIX ret; Vector3f vec_A, vec_B, vec_R; //平行移動 vec_A.x=a._41; vec_A.y=a._42; vec_A.z=a._43; vec_B.x=b._41; vec_B.y=b._42; vec_B.z=b._43; vec_R=vec_A*(1.0f-t) + vec_B*t; ret._41=vec_R.x; ret._42=vec_R.y; ret._43=vec_R.z; //スケーリング vec_A.x=a._11; vec_A.y=a._22; vec_A.z=a._33; vec_B.x=b._11; vec_B.y=b._22; vec_B.z=b._33; vec_R=vec_A*(1.0f-t) + vec_B*t; ret._11=vec_R.x; ret._22=vec_R.y; ret._33=vec_R.z; return ret; } //フレーム描画 void HIERARCHY Draw_Frame(NODE node,int Frame_Time){ while(1){ if(node.Mesh!=NULL){ glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); for(int i=0;i (signed)node.Mesh- Material.size();i++){ glPushMatrix(); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,(const GLfloat *) node.Mesh- Material[i].MaterialColor.ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,(const GLfloat *) node.Mesh- Material[i].MaterialColor.diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,(const GLfloat *) node.Mesh- Material[i].MaterialColor.specular); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,node.Mesh- Material[i].Shininess); if(node.Mesh- Material[i].TexNo 0){ glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, node.Mesh- TexID[node.Mesh- Material[i].TexNo-1]); }else{ glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } //線形補間 for(int k=1;k (signed)node.Anim.Key.size();k++){ int Length=node.Anim.Key[k]-node.Anim.Key[k-1];//キー間の長さ int Current=Frame_Time-node.Anim.Key[k-1];//キー間の現在位置 float t=(float)Current/(float)Length; if((node.Anim.Key[k-1] =Frame_Time) (node.Anim.Key[k] Frame_Time)){ MATRIX Linear = Linear_Interpolation(node.Anim.Matrix[k-1],node.Anim.Matrix[k],t); glMultMatrixf( Linear.mat_16[0]); } } if(node.Mesh- Material[i].Tridata.size() 1){ glVertexPointer(3, GL_FLOAT,sizeof(Tri) , node.Mesh- Material[i].Tridata[0].TriVer.x); glNormalPointer(GL_FLOAT,sizeof(Tri), node.Mesh- Material[i].Tridata[0].TriNor.x); //if(node.Mesh- Material[i].TexNo 0)glTexCoordPointer(2, GL_FLOAT, sizeof(Tri), node.Mesh- Material[i].Tridata[0].TriUV.u); glDrawArrays(GL_TRIANGLES,0,node.Mesh- Material[i].Tridata.size()); } if(node.Mesh- Material[i].Quaddata.size() 1){ glVertexPointer(3, GL_FLOAT,sizeof(Quad) , node.Mesh- Material[i].Quaddata[0].QuadVer.x); glNormalPointer(GL_FLOAT,sizeof(Quad), node.Mesh- Material[i].Quaddata[0].QuadNor.x); //if(node.Mesh- Material[i].TexNo 0)glTexCoordPointer(2, GL_FLOAT, sizeof(Quad), node.Mesh- Material[i].Quaddata[0].QuadUV.u); glDrawArrays(GL_QUADS,0,node.Mesh- Material[i].Quaddata.size()); } glPopMatrix(); } glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); //glDisableClientState(GL_TEXTURE_COORD_ARRAY); //glDisable(GL_TEXTURE_2D); } if(node.Node!=NULL)Draw_Frame(*node.Node,Frame_Time); if(node.Next!=NULL)Draw_Frame(*node.Next,Frame_Time); if(node.Node==NULL)return; if(node.Next==NULL)return; return; } } //アニメーション描画 void HIERARCHY Animation_Draw(int Animation_NO,int Frame){ Draw_Frame(Root,Frame); } //描画 void HIERARCHY Draw(){ Draw_Frame(Root,0); } //フレームを探す void HIERARCHY Find_Frame(NODE node,char* name){ while(1){ if(strcmp(node.FrameName.c_str(),name)==0){ pNode= node; return; } if(node.Node!=NULL)Find_Frame(*node.Node,name); if(node.Next!=NULL)Find_Frame(*node.Next,name); if(node.Node==NULL)return; if(node.Next==NULL)return; return; } return; } //アニメーション読み込み bool HIERARCHY Load_Animation(FILE fp){ char buf[255]; char name[255]; vector Quaternion; vector Transform; vector Scaling; vector Key1; vector Key2; vector Key3; int hierarchy=0,count=0,keyID,key=0,dummy=0,x=0,y=0,z=0,w=0; //合成行列 MATRIX mix; //読み込み while(!feof( fp)) { ZeroMemory(buf,sizeof(buf)); fscanf_s( fp, %s ,buf,sizeof(buf)); //AnimationSetを探す if(strcmp(buf, AnimationSet )==0){ while(!feof( fp)) { fgets(buf,sizeof(buf), fp); if(strstr(buf, AnimationKey )==NULL){ if((!strstr(buf, { )==NULL) (!strstr(buf, } )==NULL)){//名前の抽出 sscanf_s(buf, { %s } , name,sizeof(name)); pNode=NULL; Find_Frame(Root,name); pNode- Anim.Matrix.resize(Key3.size()); for(int i=0;i (signed)Key3.size();i++){ if(Key2.size()==Key3.size()){ mix._11=Scaling[i].x; mix._22=Scaling[i].y; mix._33=Scaling[i].z; } mix._41=Transform[i].x*Size; mix._42=Transform[i].y*Size; mix._43=Transform[i].z*Size; pNode- Anim.Key.push_back(Key3[i]); for(int j=0;j 16;j++)pNode- Anim.Matrix[i].mat_16[j]=mix.mat_16[j]; } Animation_MaxFrame=Key3[Key3.size()-1]; Quaternion.clear(); Scaling.clear(); Transform.clear(); Key1.clear(); Key2.clear(); Key3.clear(); } }else{ fgets(buf,sizeof(buf), fp);//キー 0 回転 , 1 拡大縮小 , 2 平行移動 keyID=atoi(buf); fgets(buf,sizeof(buf), fp);//キーデータの個数 count=atoi(buf); switch (keyID){ case 0 for(int i=0;i fscanf_s( fp, %d;%d;%f,%f,%f,%f;;, , key, dummy, vec4d.w, vec4d.x, vec4d.y, vec4d.z); Key1.push_back(key); Quaternion.push_back(vec4d); } break; case 1 for(int i=0;i fscanf_s( fp, %d;%d;%f,%f,%f;;, , key, dummy, vec3d.x, vec3d.y, vec3d.z); Key2.push_back(key); Scaling.push_back(vec3d); } break; case 2 for(int i=0;i fscanf_s( fp, %d;%d;%f,%f,%f;;, , key, dummy, vec3d.x, vec3d.y, vec3d.z); Key3.push_back(key); Transform.push_back(vec3d); } break; default break; } } } } } Animation_MaxFrame=pNode- Anim.Key[pNode- Anim.Key.size()-1]; Quaternion.clear(); Scaling.clear(); Transform.clear(); Key1.clear(); Key2.clear(); Key3.clear(); return true; } //メッシュ読み込み bool HIERARCHY Load_Mesh(FILE fp,NODE node){ vector Vertex;//頂点 vector Normal;//法線 vector uv;//UV vector VertexIndex; vector NormalIndex; vector MaterialIndex; vector FaceIndex; char key[255]; char buf[255]; int v1=0,v2=0,v3=0,v4=0; int Count=0,Hierarchy=1; string str= ; fscanf_s( fp, %s ,key,sizeof(key)); node.Mesh =new MESH(msh); //読み込み while(!feof( fp)) { //キーワード 読み込み ZeroMemory(key,sizeof(key)); fscanf_s( fp, %s ,key,sizeof(key)); //階層+ if(strcmp(key, { )==0){ Hierarchy++; } //階層- if(strcmp(key, } )==0){ Hierarchy--; if(Hierarchy==0){ Count=0; //マテリアル毎のデータを作成 for(int i=0;i (signed)MaterialIndex.size();i++){ if(FaceIndex[i]==3){ for(int j=0;j 3;j++){ Tri.TriVer=Vertex[VertexIndex[Count+j]]; Tri.TriNor=Normal[NormalIndex[Count+j]]; //Tri.TriUV=uv[VertexIndex[Count+j]]; node.Mesh- Material[MaterialIndex[i]].Tridata.push_back(Tri); } Count+=3; }else{ for(int j=0;j 4;j++){ Quad.QuadVer=Vertex[VertexIndex[Count+j]]; Quad.QuadNor=Normal[NormalIndex[Count+j]]; //Quad.QuadUV=uv[VertexIndex[Count+j]]; node.Mesh- Material[MaterialIndex[i]].Quaddata.push_back(Quad); } Count+=4; } } Vertex.clear(); Normal.clear(); uv.clear(); VertexIndex.clear(); NormalIndex.clear(); MaterialIndex.clear(); FaceIndex.clear(); return true; } } //頂点 読み込み if(strcmp(key, Mesh )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); Count=atoi(buf); for(int i=0;i { fscanf_s( fp, %f;%f;%f;, , vec3d.x, vec3d.y, vec3d.z); Vertex.push_back(vec3d*(float)Size); } //頂点インデックス読み込み fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); while(strchr(buf, ; )==NULL){fgets(buf,sizeof(buf), fp);}//空行対策 Count=atoi(buf); for(int i=0;i { int dammy=0; fgets(buf,sizeof(buf), fp); str=buf; string size_type first = str.find_first_not_of( ); string size_type index = str.find( 3; ); if(index-first==0){ sscanf_s(buf, %d;%d,%d,%d;, , dammy, v1, v2, v3); VertexIndex.push_back(v1); VertexIndex.push_back(v2); VertexIndex.push_back(v3); } if((index==-1)||(index-first 1)){ sscanf_s(buf, %d;%d,%d,%d,%d;, , dammy, v1, v2, v3, v4); VertexIndex.push_back(v1); VertexIndex.push_back(v2); VertexIndex.push_back(v3); VertexIndex.push_back(v4); } FaceIndex.push_back(dammy); } } //法線 読み込み if(strcmp(key, MeshNormals )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); Count=atoi(buf); for(int i=0;i { fscanf_s( fp, %f;%f;%f;, , vec3d.x, vec3d.y, vec3d.z); Normal.push_back(vec3d); } //法線インデックス読み込み fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); while(strchr(buf, ; )==NULL){fgets(buf,sizeof(buf), fp);}//空行対策 Count=atoi(buf); for(int i=0;i { int dammy=0; fgets(buf,sizeof(buf), fp); str=buf; string size_type first = str.find_first_not_of( ); string size_type index = str.find( 3; ); if(index-first==0){ sscanf_s(buf, %d;%d,%d,%d;, , dammy, v1, v2, v3); NormalIndex.push_back(v1); NormalIndex.push_back(v2); NormalIndex.push_back(v3); } if((index==-1)||(index-first 1)){ sscanf_s(buf, %d;%d,%d,%d,%d;, , dammy, v1, v2, v3, v4); NormalIndex.push_back(v1); NormalIndex.push_back(v2); NormalIndex.push_back(v3); NormalIndex.push_back(v4); } } } //マテリアルリスト if(strcmp(key, MeshMaterialList )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//空改行 fgets(buf,sizeof(buf), fp);//マテリアル数 fgets(buf,sizeof(buf), fp);//リスト要素数 Count=atoi(buf); for(int i=0;i { fgets(buf,sizeof(buf), fp); int test=atoi(buf); MaterialIndex.push_back(test); } } //マテリアル読み込み if(strcmp(key, Material )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//直後の行にあると推定 改行する //ディフューズ fscanf_s( fp, %f;%f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z, vec4d.w); mtl.MaterialColor.diffuse=(const Color4 )vec4d; //SHININESS fscanf_s( fp, %f; , mtl.Shininess); //スペキュラー fscanf_s( fp, %f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z); mtl.MaterialColor.specular=(const Color4 )vec4d; //エミッシブ fscanf_s( fp, %f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z); mtl.MaterialColor.ambient=(const Color4 )vec4d; node.Mesh- Material.push_back(mtl); } } return false; } //フレーム読み込み bool HIERARCHY Load_Frame(FILE fp,NODE node,int hierarchy){ char key[255]; int begin=0,end=0; int current=hierarchy;//現在の階層 int file_pos; while(!feof( fp)) { //キーワード 読み込み ZeroMemory(key,sizeof(key)); fscanf_s( fp, %s ,key,sizeof(key)); //ヘッダー読み飛ばし if(strcmp(key, Header )==0){ while(strcmp(key, } )){ fscanf_s( fp, %s ,key,sizeof(key)); } continue; } //テンプレート読み飛ばし if(strcmp(key, template )==0){ while(strcmp(key, } )){ fscanf_s( fp, %s ,key,sizeof(key)); } continue; } //階層+ if(strcmp(key, { )==0){ begin++; } //階層- if(strcmp(key, } )==0){ end++; } //フレーム if(strcmp(key, Frame )==0){ fscanf_s( fp, %s ,key,sizeof(key)); if(((begin==0) (end==0))||(end-begin==-1)){//子ノード追加 node.Node=new NODE(nde); node.Node- FrameName=key; file_pos=ftell( fp); Load_Mesh(fp,*node.Node); fseek( fp, file_pos, SEEK_SET ); hierarchy++; Load_Frame(fp,*node.Node,hierarchy);//再帰呼び出し } if(Back==current){//階層戻り先にきた場合、同一階層追加 Back=-1; node.Next=new NODE(nde); node.Next- FrameName=buffer; file_pos=ftell( fp); Load_Mesh(fp,*node.Next); fseek( fp, file_pos, SEEK_SET ); Load_Frame(fp,*node.Next,current);//再帰呼び出し } if(end-begin 0){// } が { より多い時は階層を戻る strcpy_s(buffer,255,key); Back=current-(end-begin); return true; } if((end-begin==0) ((begin!=0) (end!=0))){//同一階層追加 node.Next=new NODE(nde); node.Next- FrameName=key; file_pos=ftell( fp); Load_Mesh(fp,*node.Next); fseek( fp, file_pos, SEEK_SET ); Load_Frame(fp,*node.Next,current);//再帰呼び出し } //階層を戻る if((Back!=-1) (Back } } return true; } //階層メッシュ読み込み bool HIERARCHY Load_Hierarchy(char* FileName){ //Xファイルを開いて内容を読み込む Back=-1; int Hierarchy=0; FILE* fp=NULL; fopen_s( fp,FileName, rt ); //読み込み fseek(fp,0,SEEK_SET); Load_Frame(*fp,Root,Hierarchy); fseek(fp,0,SEEK_SET); Load_Animation(*fp); fclose(fp); return true; } main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include xfile.h #include font.h #define WIDTH 320 #define HEIGHT 240 float angle=0.0f; HIERARCHY* hierarchy; GLFONT *font; wstring wstr; wchar_t wchar[255]; int CurrentFrame; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0,0,WIDTH,HEIGHT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, WIDTH/HEIGHT, 0.1, 2000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 1000.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //階層アニメーション hierarchy- Animation_Draw(0,CurrentFrame); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); wstr=L 最大フレーム[ ; _itow_s(hierarchy- Animation_MaxFrame,wchar,255,10); wstr+=wchar; wstr+=L ] ; font- DrawStringW(0,16,(wchar_t *)wstr.c_str()); wstr=L 現在のフレーム[ ; _itow_s(CurrentFrame,wchar,255,10); wstr+=wchar; wstr+=L ] ; font- DrawStringW(0,32,(wchar_t *)wstr.c_str()); glutSwapBuffers(); } void idle(void) { if(hierarchy- Animation_MaxFrame CurrentFrame)CurrentFrame=0; Sleep(1); glutPostRedisplay(); } //タイマー void timer(int value) { CurrentFrame+=30; glutTimerFunc(10 , timer , 0); } void Init(){ glClearColor(0.0, 0.0, 0.0, 1.0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); hierarchy = new HIERARCHY( sample3.x ,100); font = new GLFONT(L MS明朝 , 16); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( Xの階層メッシュアニメーション読み込み ); glutDisplayFunc(display); glutIdleFunc(idle); glutTimerFunc(10 , timer , 0); Init(); glutMainLoop(); return 0; }
https://w.atwiki.jp/zeturin/pages/401.html
目次 【時事】ニュースZummy ズミー RSSZummy ズミー 口コミZummy ズミー 【参考】ブックマーク 関連項目 タグ 最終更新日時 【時事】 ニュース Zummy gnewプラグインエラー「Zummy」は見つからないか、接続エラーです。 ズミー gnewプラグインエラー「ズミー」は見つからないか、接続エラーです。 RSS Zummy gnewプラグインエラー「Zummy」は見つからないか、接続エラーです。 ズミー #gnews plugin Error gnewsは1ページに3つまでしか使えません。別ページでご利用ください。 口コミ Zummy #bf ズミー #bf 【参考】 ブックマーク サイト名 関連度 備考 はてなキーワード ★★ 関連項目 項目名 関連度 備考 参考/阿吽 ★★★ タグ 人物 最終更新日時 2012-12-19 冒頭へ
https://w.atwiki.jp/ff11_uni/pages/24.html
Zipacna Drop:北玉(玄武トリガー) 抽選時間:没後3時間~ 敵はゴーレム。(視覚・魔法感知) ヴェ・ルガノン宮殿北側(庭のI-5~G-5)から入って、1時と11時の間を巡回しています。 移動速度速めのため”影縫い”や”グラビデ”などで釣り、階段(エリア)付近で戦います。 【戦闘】 空NM中攻撃力No.1。赤ソロも可能ですが舐めてかかると死にます。 ナ盾忍盾どちらでも可能ですが、うちは忍盾マラソンが主。 範囲攻撃連発するため、前衛後衛共にしっかり距離を取ること。 蝉持ちアタッカーはヒット&アウェイ、殴りでタゲをとらないように。 グラ、バインドが有効なので、きっちり弱体を入れつつマラソン。 常に盾のHPに気を配るようにお願いします。 黒には精霊でガンガン削ってもらい、タゲを取ったら庭へエリアしヘイト抜き。 精霊しつつ、こまめにスタンも入れて盾サポートして下さい。 ※黒がタゲを持ってエリアする際、一時的にタゲ切れ状態になる事があります(黄ネームに戻る) この時に他PCがいれば、挑発等で取られてしまう事もあります。 ライバルが居る場合はエリア無しで、少しずつ精霊で削っていきましょう。
https://w.atwiki.jp/adamina/
@wikiへようこそ ウィキはみんなで気軽にホームページ編集できるツールです。 このページは自由に編集することができます。 メールで送られてきたパスワードを用いてログインすることで、各種変更(サイト名、トップページ、メンバー管理、サイドページ、デザイン、ページ管理、等)することができます まずはこちらをご覧ください。 @wikiの基本操作 用途別のオススメ機能紹介 @wikiの設定/管理 分からないことは? @wiki ご利用ガイド よくある質問 無料で会員登録できるSNS内の@wiki助け合いコミュニティ @wiki更新情報 @wikiへのお問合せフォーム 等をご活用ください @wiki助け合いコミュニティの掲示板スレッド一覧 #atfb_bbs_list その他お勧めサービスについて 大容量1G、PHP/CGI、MySQL、FTPが使える無料ホームページは@PAGES 無料ブログ作成は@WORDをご利用ください 2ch型の無料掲示板は@chsをご利用ください フォーラム型の無料掲示板は@bbをご利用ください お絵かき掲示板は@paintをご利用ください その他の無料掲示板は@bbsをご利用ください 無料ソーシャルプロフィールサービス @flabo(アットフラボ) おすすめ機能 気になるニュースをチェック 関連するブログ一覧を表示 その他にもいろいろな機能満載!! @wikiプラグイン @wiki便利ツール @wiki構文 @wikiプラグイン一覧 まとめサイト作成支援ツール バグ・不具合を見つけたら? 要望がある場合は? お手数ですが、お問合せフォームからご連絡ください。
https://w.atwiki.jp/kobapan/pages/21.html
Emacs-Lisp Emacs-Lisp/buffer-listからファイルとディレクトリの一覧をフルパスで取得 (2015-02-24 21 31 08) Emacs-Lisp/setとsetfとsetqの違い (2015-03-05 20 31 12) Emacs-Lisp/mapcarとmapc (2015-03-10 07 56 33) Emacs-Lisp/ファイルパス関連 (2015-03-14 20 26 14) Emacs-Lisp/kill-other-buffers (2015-03-14 23 50 32) Emacs-Lisp/*scratch* の永続化 (2015-03-14 23 52 05) Emacs-Lisp/現在行をハイライト (2015-03-23 18 21 08) Emacs-Lisp/lambda関数にクォートはいるのか (2015-03-25 17 10 12) Emacs-Lisp/mapcar*で引数に複数のリストを取る (2015-03-25 17 50 30) Emacs-Lisp/前回終了時のフレームサイズで起動する (2015-06-28 17 40 40) Emacs-Lisp/diredでファイルをOSアプリケーションで開く (2015-06-28 19 48 18) Emacs-Lisp/trim Emacs-Lisp/文字列から文字列を検索する Emacs-Lisp/シェル の PATH と alias を、eshell に引き継ぐ Emacs-Lisp/書き込み権限のないファイル・ディレクトリをsudoで開く、sudo.el Emacs-Lisp/今開いているファイルの関数一覧をさっと見るkokopelli.el Emacs-Lisp/簡易なプロジェクト管理bookmark-buffers.el Emacs-Lisp/ウィンドウ間の移動 Macro Emacs-Lisp/defgroup (2009-01-04 07 57 23) Emacs-Lisp/Common Keywords (2009-01-04 08 14 58) Emacs-Lisp/font-lock-add-keywords (2009-01-04 16 11 26) Emacs-Lisp/defface (2009-01-04 16 22 42) Emacs-Lisp/defconst (2009-01-04 17 57 18) Emacs-Lisp/font-lock-fontify-buffer (2009-01-04 18 09 08) Emacs-Lisp/delq (2009-01-06 08 12 39) Emacs-Lisp/delete (2009-01-06 08 25 58) Emacs-Lisp/memq (2009-01-06 08 26 23) Emacs-Lisp/mapcar (2009-01-06 23 01 56) Emacs-Lisp/japanese-hankaku (2009-01-06 23 05 12) Emacs-Lisp/append (2009-01-08 07 58 47) Emacs-Lisp/concat (2009-01-08 07 59 40) Emacs-Lisp/case-fold-search (2009-01-09 06 03 20) Emacs-Lisp/case-replace (2009-01-09 06 07 00) Emacs-Lisp/nconc (2009-01-09 06 24 06) Emacs-Lisp/defsubst (2009-01-10 14 01 04) Emacs-Lisp/car-safe (2009-01-10 14 13 52) Emacs-Lisp/dolist (2014-05-26 17 44 58)
https://w.atwiki.jp/mnm_mcsv/pages/67.html
NEKO-MANMA s MCSV プレイ環境の構築 初めて参加される方は、先にサーバーについて 及び 構成情報(※重要)?をご覧下さい。-クライアントのフォルダ構成やMODの基本的な知識・用語については、MinecraftJapanWikiをご覧下さい。このページでは、詳細は省いて簡単に手順を説明します。-Windows環境を前提とした説明です。 NEKO-MANMA's MCSV プレイ環境の構築 [#n6a68955] 構築の準備 [#i56c4527] MODの導入 [#b0468e91] 構築の準備 MOD導入の作業を行う為の前作業です 7-Zipの導入.jarや.zip等の拡張子の圧縮ファイルを簡単に操作する為に必要です。 ダウンロード・インストールインストーラをこちらからダウンロード。ダウンロードしたファイルを実行し、インストーラの指示に従いインストールして下さい。(インストール先のフォルダを覚えておいて下さい) 拡張子の関連付け (この作業は、実際にMODを導入する際でも構いません) (この作業は行わなくても構いませんが、.jarや.zipを開く度に 右クリック→7-zipで開く を選択しなければならないので、面倒です) .minecraft/bin/ フォルダの中にある「minecraft.jar」を右クリックし、「プログラムから開く」→「既定のプログラムの選択...」を選択。 「この種類のファイルを開く時は〜」のチェックボックスにチェックを入れ、「参照...」ボタンをクリック 7-Zipをインストールしたフォルダ(〜/7-Zip/)の中の「7zFM.exe」を選択し「開く」、「OK」 「minecraft.jar」を解凍せずに中身を覗けた事を確認。 適当なzipファイルを右クリックし、同様の手順で関連付ける。 マルチプレイ用クライアントの用意シングルプレイと切り離したマルチプレイ専用環境を用意し、それぞれのMOD導入時の競合を心配しなくて良いようにします。 適当な場所に、クライアントを格納するフォルダを作ります。仮に"C \mcsv"とします。(日本語や半角スペースを含まないパスに置いて下さい) 適当な場所(デスクトップ等)に新規テキストファイルを作成し、「起動.bat」とリネームします。(「起動」の部分は何でもいいです) 「起動.bat」をテキストエディタで開き、以下の内容を入力し、保存します。 set APPDATA=C \mcsv C \Minecraft.exe 「C \mcsv」は、最初に作ったフォルダのパスです。 「C \Minecraft.exe」は、Minecraftランチャー(Minecraft.exe)のパスです。 「起動.bat」をダブルクリックし、ランチャーが起動することを確認します。 うまく起動しない場合は、入力したパスが合っているか、パスに日本語や半角スペースが含まれていないか確認してください。 「Minecraft.exe」が日本語を含むフォルダ(デスクトップ等)に置いてある場合、「起動.bat」を「Minecraft.exe」と同じ場所に移動し、.batファイルの2行目を「Minecraft.exe」と変更してもOKです。 起動したランチャーでログインし、クライアントのダウンロードが始まることを確認します。 クライアントが起動したら終了し、「C \mcsv」以下に「.minecraft」フォルダが出来ていたら完了です。当サーバーでのマルチプレイ用にMODを入れる場合、この.minecraftフォルダ以下に適用します。(この時点で、.minecraftフォルダごと何処かにコピーし、バックアップしておく事をお勧めします)++以降、当サーバーへ接続する場合は、「起動.bat」からクライアントを起動します。 MODの導入 MODを.minecraftフォルダ以下に適用していきます。 前提系/一部上書き系(.jar内の既存ファイルを上書きする物)MODを入れ直す際は、必ずバニラ状態からやり直して下さい ForceUpdateでは、余計なファイルが残る場合があります。 以下の説明の中で.jarや.zipを「開く」とは、7-Zipファイルブラウザで開く事を指します。( 解凍ではありません ) 「7-Zipの導入」の手順で拡張子の関連付けがしてあれば、ダブルクリックで開けます。 MODのダウンロード構成情報/現在の構成の現在の構成表に記載されているMODの指定されたバージョンをすべてダウンロードします。 各MODのダウンロードページへのリンクはMOD一覧?に記載されています。 「.minecraft/bin/mainecraft.jar(以下、mainecraft.jar)」をダブルクリックして開きます。中にある 「META-INF」フォルダを削除 して下さい。 「前提MOD」を入れます。++「Modloader」のzipを開き、中身をすべて「mainecraft.jar」へ入れて下さい。7-Zip上でファイルをドラッグ ドロップできます。 「ModloaderMP」のzipを開き、同じように中身をすべて「mainecraft.jar」へ入れて下さい。++「PlayerAPI」のzipを開き、中身をすべて「mainecraft.jar」へ入れて下さい。+開いている7-Zipをすべて閉じ、一旦 Minecraftを起動します。(少なくとも、必ず minecraft.jarを開いている7-Zipは閉じてから起動 して下さい)うまくタイトル画面まで行ったら、Minecraftを終了します。+「./minecraft/mods」フォルダが新しく出来ているはずです。前提MODではないMODは、基本的にこのフォルダへzipごと入れます。例外もあります。+「./minecraft/coremods」というフォルダも出来ています。ここへは、「CoreMods」指定された.jarファイルを入れます。 前提MOD以外の残りのMODをインストールします。構成情報/現在の構成の表の順番で、MOD一覧?の各MODのインストール手順を参照しつつ 作業して下さい。 すべてのMODの導入が完了したら、マルチプレイサーバーへ接続する前に シングルプレイモードで世界をつくり、軽く動作確認を行って下さい。
https://w.atwiki.jp/blackwakejapan/pages/27.html
未完成 ここではサーバーを立てるまでを下記のURLを参考に日本語で説明していきます。 http //steamcommunity.com/sharedfiles/filedetails/?id=873816561 ※注意:ここでの日本語説明は編集者の解釈で記すため、本来のやり方とは異なっているかもしれません。予めご了承ください。 目次 SteamCMDのダウンロード Blackwake Serverのダウンロード 起動パッチ作成 ポート開放 サーバー設定 既知の問題点 追加情報 SteamCMDのダウンロード 下記のURLからsteamcmd.zipをダウンロードしてください。 https //steamcdn-a.akamaihd.net/client/installer/steamcmd.zip ダウンロードしたら好きな場所にsteamcmd.zipを解凍してください。 そしたら解凍したsteamcmd.exeを起動します。が、steamcmd.exeがあるフォルダに必要なファイルがダウンロードされるので気をつけてください。 Blackwake Serverのダウンロード SteamCMDを使用しサーバーをダウンロードします。 steamcmd.exeを起動し、コマンドを次の順に3つずつ入力します。 login anonymous force_install_dir ./blackwake_server/ app_update 423410 validate 2つ目のコマンドは入力しても何も出ませんがそれでOKです。 3つ目のダウンロードが終わったらquitと入力し閉じてください。 ※注意 Blackwakeがアップデートした際にはサーバー側は手動でアップデートしてください。手順はダウンロードした時と同じだと思われます。(未検証) 起動パッチ作成 上記でダウンロードしたblackwake_serverフォルダ内にテキストファイルを作成してください。 そしたら開いて下記の通り書き込んでください。 start "" "BlackwakeServer.exe" -batchmode -nographics 次に名前をserver update.batに変更し、保存してください。 以降このbatファイルが起動ファイルとなります。 ポート開放 自分意外の人がサーバーに接続できるようにするためにポート開放する必要があります。 下記のポートを開放してください。 25001 UDP 26915 UDP 27015 UDP ポート開放するにあたって、上記でダウンロードしたBlackwakeServer.exeをファイアウォールから許可しておく必要があります。 また、ウイルス対策ソフトを使用されている場合はそのソフトからファイアウォールを通してBlackwakeServer.exeを許可してください。 サーバー設定 server update.batを起動するといくつかファイルが新たに生成されます。 (サーバー起動後、確立するまで2~3分かかります。) その中のServer.cfgをメモ帳かなにかで開いてください。 下記の内容を編集することでサーバー設定を変更できます。 serverName=リストで表示されるサーバーの名前(デフォルト:my server) useIP=使用しているPCのIPを入力。基本デフォルトでOK(デフォルト: )←スペース port=サーバーのポート(1~65535)(デフォルト:25001) sport=Steamサーバーのポート(1~65535)(デフォルト:27015) hideFromList=Steamリストからサーバーを隠す。(1で非表示)(デフォルト:0) password=パスワードです。(デフォルト: )←スペース restartHour=時間帯を変更します(0-23)(デフォルト:00) gamemode=ゲームモード各種は下記の通り。 1=1vs1Hoy | 2=1vs1Galleon |3-|4-| 5=2vs2Hoy | 6=2vs2Galleon | 7=Fleet(1-7)(デフォルト:5) friendlyPlayerCollision=プレイヤー衝突?これよくわからない。(0or1)(デフォルト:0) friendlySpreadFires=プレイヤーが触れると燃え移り。(0or1)(デフォルト:0) friendlyFire=プレイヤーの同士討ち。(0or1)(デフォルト:0) frindlyShipDamage=味方船へのフレンドリーファイア。(0or1)(デフォルト:0) forceEqualFactions=新規参加する際の人数調整。(0or1)(デフォルト:1) shipSpeadFactor=船のスピード変更。(0-X)(デフォルト:1) playerUpdateRate=times/sでプレイヤーの位置を更新。(10-X)(デフォルト:15) allowGlobalVoice=戦績画面で相手チームに話しかけれる。(0or1)(デフォルト:0)] 既知の問題点 追加情報
https://w.atwiki.jp/rijk/pages/84.html
New Insights On Critical Hits http //forums.hellgatelondon.com/showpost.php?p=869125 postcount=4 Scapes氏によると、武器やModに付いたCritical Damage Bonusなどを総合した計算式は以下のとおり。 BASE DAMAGE + (BASE DAMAGE x (CRITICAL MULTIPLIER + DAMAGE MULTIPLIER)) = CRITICAL BASE DAMAGE 一方、"Adds 7% Toxic Damage" ModのようなElemental damage multiplierは、BASE DAMAGEには直接適用されず、別枠で求める。 ELEMENTAL DAMAGE + (ELEMENTAL DAMAGE x (CRITICAL MULTIPLIER + DAMAGE MULTIPLIER)) = CRITICAL ELEMENTAL DAMAGE 例) BASE DAMAGE = 100 CRITICAL MULTIPLIER = 300% DAMAGE MULTIPLIER = 20% ELEMENTAL MULTIPLIER 1 = 5% Toxic ELEMENTAL MULTIPLIER 2 = 5% Toxic ELEMENTAL MULTIPLIER 3 = 10% Spectral A = 100 + (100 x (3 + .2)) = 420 B = 5 + (5 x (3 + .2)) = 21 C = 5 + (5 x (3 + .2)) = 21 D = 10 + (10 x (3 + .2)) = 42 A + B + C + D = 504 = TOTAL CRITICAL DAMAGE ------------------------------------------------------------------------------------------------- Scapes氏の返答 New Insights On Critical Hits http //forums.hellgatelondon.com/showpost.php?p=884108 postcount=44 Q. 100% Critical chance against DemonsなどのCritical chance multiplierは、通常のCritical Chanceに対して加算されるのか、それとも乗算されるのか? A. 加算される。 Q. Dual FocusなどのCriticalは両方とも別々に発動すると考えてよいのか? A. YES. Focusだけでなくdual wielding weaponsは、キャラクター画面に表示されているとおり、個々にCriticalを発動する。 Q. あなたの数式に従えば、divineを6個詰め込むよりも、3 * divines + 3 * elementals (the elementals add 20% damage) のほうがダメージが増えるということ? A. 大体そんな感じ。 Q. Sniperスキルの150% Increase damageは数式に挿入されるものなのか、それとも最終的に加算・乗算されるものなのか? A. 前者。 Q. Beaconの追加ダメージは、仮に50%とするとどの過程で計算されるのか? A. 数式内で0.5として扱われる。 Q. MolochにCritical Chanceの上限は設けられているのか?武器で+300% Critical chance against Demons、スナイパー・モードで26%のCritical chanceなのに、ほとんどクリティカルが発動しないんだけど。 A. Critical Chanceに上限が設定されているとは考えていない。少なくともそのようなことは聞いたことがない。 Q. elemental damageはなぜベース・ダメージの計算とは別になっているのか? A. 仕様です。 ------------------------------------------------------------------------------------------------- How to figure out your damage. ViperFUD氏による投稿03-28-2008 http //forums.hellgatelondon.com/showthread.php?t=86903 ここではADI (Average Damage Index)という用語を使う。これは一定時間内に武器が与える平均ダメージを意味し、クリティカル・チャンス、クリティカル・ダメージ・ボーナス(CDB)などを含む値。 ADIの算出 "adds 5% toxic damage"のModだけを使用した場合、仮にbase_damageを100とすると、elemental_damageは5%すなわち5となり、damageは100 + 5 = 105。 ここから導き出せる数式は、base_damage + base_damage * elemental_damageとなる。 これは、base_damage * (1 + elemental_damage)と同じなので、次のようにまとめられる。 damage (ADI) = base_damage * (1 + elemental_damage) "increases damage by 20%"などのModの場合も、damage = 100 * 120% = 120なので、導き出される数式はelemental_damageの場合と同じ。 damage = base_damage * (1 + damage_multiplier) 上記"adds 5% toxic damage"、"increases damage by 20%"の二つを同時に使用した場合、Scapes氏の情報によれば、elemental damageは次の数式を用いることになる。 total_elemental_damage = elemental_base_damage * (1 + damage_multiplier) したがって以下のようになる。 damage = [ base_damage * (1 + damage_multiplier) ] + [ base_elemental_damage * (1 + damage_mulitplier) ] 単純化すると、damage = (base_damage + base_elemental_damage) * (1 + damage_multiplier)。また、"adds 5% toxic damage" Modの際に記したように、base_damage + base_elemental_damage = base_damage * (1 + elemental_damage)なので、次のように要約できる。 damage = base_damage * (1 + elemental_damage) * (1 + damage_multiplier) [1] Scapes氏によると、Critical Damage Bonusはincrease damageなどのdamage multiplierに対して乗算ではなく「加算」される。"Increases damage by 20%" Modを使用し、且つCritical Damage Bonus 280%の場合、ベース・ダメージを100とすると、100 * ( 100% + 20% + 280%) = 100 * 4 = 400。 一方、"adds 5% toxic damage" などのElemental Damageについては、別枠で求めなければならない。数式は上記と同様のものを用いる。ダメージは、5 * ( 1 + .2 + 2.8 ) = 5 * 4 = 20。 したがって全体のダメージは400 + 20 = 420。 [1]の公式を基にCritical Damage Bonusを挿入してみると、 damage = base_damage * (1 + elemental_damage) * (1 + damage_multiplier + critical_damage_bonus) さて、これに10%のCritical ChanceをスキルなりModなりで得たとしよう。ダメージの90%にはCritical Damage Bonusが適用されないので、以下の数式になる。 damage = (100% - crit_chance) * base_damage * (1 + elemental_damage) * (1 + damage_multiplier) + crit_chance * base_damage * (1 + elemental_damage) * (1 + damage_multiplier + critical_damage_bonus) これを[ ]を使ってもっとシンプルにしてみると、以下のようになる。 damage = base_damage * (1 + elemental_damage) * [1 + damage_multiplier + crit_chance*critical_damage_bonus] [2] ※中略。 ここで、使用する武器にいったん立ち戻ってみよう。 100 damage/shotのsniper rifleと、10 damage/shotのautomatic rifleを比べてみると、一発のダメージはsniper rifleのほうが上だが、sniper rifleを30 shots/minute、automatic rifleを400 shots/minuteとした場合、一定時間内のトータル・ダメージではautomatic rifleの方に軍配が上がる (100 * 30 = 3000, 10 * 400 = 4000)。したがってrate of fire(弾丸の発射速度)も考慮しなければならない。 rate of fireはshots/minute、またはshots/secondで算出できるから[2]を使って damage = base_damage * rate_of_fire * (1 + elemental_damage) * [1 + damage_multiplier + crit_chance*critical_damage_bonus] rate of fireをbase damageの右に置いたのは、DPSとweapon damageの値が置き換え可能だから。言い換えれば、50(dps)だろうが100/3000 (damage/min) だろうが、好きな値を選べばいい。それよりもrate of fireのボーナス(またはペナルティ)のほうが重要だ。たとえばSniper (rank 1)を使えばRoF (Rate of Fire)が50%減少してDPSは50から25に下がるし、Rapid Fireを使えばDPSは上がる。だから、RoF bonusも加える必要がある。 damage = base_damage * rate_of_fire * (1 + elemental_damage) * [1 + damage_multiplier + crit_chance*critical_damage_bonus] * (1 + RoF_Bonus) これでようやくADIを求める方程式が完成だ。この公式を使えば、Critical ChanceもIncreased DamageもElemental Damageも全部ひっくるめてダメージをはじき出すことができる。 Critical Chance/Damage Modダメージの算出 普通は、「+2% Critical chanceと+100% Critical Damage Bonusのどっちがいい?」みたいな疑問のほうが多いだろう。それだけならADI式の大部分は必要ない。"Increases Damage by X%" Modと"Increases Critical Damage by Y%" Modのどちらを使うべきか計算する場合、どんな武器にも適用されるのだから、Base Weapon DamageもRoFも考慮に入れなくていい。公式から一部を取り出して[1 + damage_multiplier + crit_chance*critical_damage_bonus]の数式を得れば事足りる。 一例として、0% Increases Damage、5% Critical Chance、100% CDB (Critical Damage Bonus)の状態で、"Increases damage by 20%" Modと"Critical Damage Bonus +150%" Modを比較してみよう。 Formula [1 + damage_multiplier + crit_chance*critical_damage_bonus] Code Base value (1 + 0 + .05 * 1) = 1.05 20% Divine Mod (1 + .2 + .05 * 1) = 1.25 150% Crusher s Mod (1 + 0 + .05 * 2.5) = 1.125 Critical Chanceが5%の場合、Crusher s Modが7%のダメージ増に対し、Divine Modは19%のダメージ増だからDivineの方がいい。 Code Base value (1 + 0 + .20 * 1) = 1.2 20% Divine Mod (1 + .2 + .20 * 1) = 1.4 150% Crusher s Mod (1 + 0 + .20 * 2.5) = 1.5 ところがCritical Chance 20%になると、Divine Mod (damage = +16.7%)よりもCrusher s Mod (damage = +25%)の方がダメージは高くなる。 これには二つの理由がある。一つは、Critical Chanceが上昇したことによってModの比率が逆転したこと。状況次第でLegendaryよりRare Modのほうが有効な場合もありうる。もう一つは、ある効果が他の効果に干渉するということ。+20% Divine ModはCritical Chanceが5%なら+19%ダメージだが、Critical Chanceが高くなるとADIは+16%ダメージに下がってしまう。 Critical Chanceが100%の場合はどうなるだろう? Code Base value (1 + 0 + 1 * 1) = 2 20% Divine Mod (1 + .2 + 1 * 1) = 2.2 Modには+20%と表示されていても、実際のダメージは+10%とさらに下がる。 CDBが高い場合もまた、同じ現象が起こる(CDB = 1000%とすると、+20% Damage Modの効果は1.8%まで減少し、一方+100% CDB Modの場合は9%ダメージが増加する)。 次に、Critical Chanceを20%に設定して、すでに200% CDBがある状態と1000% CDBがある状態とで、100% CDB Modを使用した場合を比較してみよう。 Code Base value (1 + 0 + .20 * 2) = 1.4 100% Crusher s Mod (1 + 0 + .20 * 3) = 1.6 Base value (1 + 0 + .20 * 10) = 3 100% Crusher s Mod (1 + 0 + .20 * 11) = 3.2 200% CDBのときは+14%、1000% CDBのときはたったの+6.7%しかダメージが上昇していない。もちろん、実際の数値に目を向けることは重要だし、ダメージ上昇率も悪い。だが、1100%にすれば300%の2倍のダメージを得られるのだから、CDBを増やすのをあえて躊躇することもない。 では、15% Critical chance、20% Increased damage、200% CDBの状態で1つだけModスロットが空いていた場合、+2% Critical Chance、+20% Damage、+200% CDBのうち、どのModを使うべきか? Code Base value (1 + .2 + .15 * 2) = 1.5 +2% Crit Mod (1 + .2 + .17 * 2) = 1.54 +20% Damage Mod (1 + .4 + .15 * 2) = 1.7 +200% CDB Mod (1 + .2 + .15 * 4) = 1.8 見てのとおり、CDB Modがベストだ。 もし2スロットの武器を拾った場合は、どの組み合わせがいいだろう? Code Base value (1 + .2 + .15 * 2) = 1.5 20% damage 200% CDB (1 + .4 + .15 * 4) = 2 2% crit 200% CDB (1 + .2 + .17 * 4) = 1.88 2% crit 20% damage (1 + .4 + .17 * 2) = 1.74 +Damage Modと+CDB Modが最適と出た。1スロットの場合にこの2つが上位を占めていたから、これは妥当な線だ。 最後に、ベースが15% Critical chance、20% Increases damage、1000% CDBだとしたら? Code One Slot Base value (1 + .2 + .15 * 10) = 2.7 2% crit (1 + .2 + .17 * 10) = 2.9 20% damage (1 + .4 + .15 * 10) = 2.9 200% CDB (1 + .2 + .15 * 12) = 3 Two Slots Base value (1 + .2 + .15 * 10) = 2.7 20% damage 200% CDB (1 + .4 + .15 * 12) = 3.2 2% crit 200% CDB (1 + .2 + .17 * 12) = 3.24 2% crit 20% damage (1 + .4 + .17 * 10) = 3.1 1スロットの場合は2% Critical Chance Modと20% Damage Modが同値になる(ベストは200% CDB Mod)。2スロットの場合はCDB ModとCritical chance Modの組み合わせが相乗効果を発揮して良いようだ(ここではわずかな違いしかないが、数値が大きくなるとその差はより明瞭になる)。 Sniper Skillの問題 Sniperスキルはダメージを増加するが、RoU/RoF (rate of use/rate of fire)にペナルティが課せられる。数式は公式から一部分を取り出せばいい。 Formula [1 + damage_multiplier + crit_chance*critical_damage_bonus] * (1 + RoF_Bonus) Sniper使用時のダメージ上昇率は+150% (1.5)。 Rank1の場合はRoF bonusが-50%、Rank10の場合はRoF bonusが-23%になる。 Critical Chance 1%、CDB 100%で試してみよう。 Code Base value (1 + 0.0 + .01 * 1) * (1 + 0) = 1.01 Sniper Rank 1 (1 + 1.5 + .01 * 1) * (1 - .50) = 1.255 (24.3% damage increase) Sniper Rank 10 (1 + 1.5 + .01 * 1) * (1 - .23) = 1.9327 (91.4% damage increase) Critical Chance25%、CDB 500%ではどうだろうか。 Code Base value (1 + 0.0 + .25 * 5) * (1 + 0) = 2.25 Sniper Rank 1 (1 + 1.5 + .25 * 5) * (1 - .5) = 1.875 (16.7% damageDECREASE) Sniper Rank 10 (1 + 1.5 + .25 * 5) * (1 - .23) = 2.8875 (28.3% damage increase) それほど大仰なCritical Chance、CDB値ではないのに、Rank1ではダメージが減少してしまった。Critical Chance、CDBの値(crit_chance*critical_damage_bonus)が高くなればなるほどダメージは少なくなり、Sniperスキルのダメージ・ボーナスは失われていく。もし"+100% Critical Chance Multiplier to Necros"などの効果が付いた銃を使ったならば、Critical Chanceは25%から50%へと上昇し、Sniper使用時のダメージはさらに悪化してしまう。 次に、Master Sniperを見てみよう。このスキルは1ランクごとに+1% Critical Chance、+ 20% CDBを得ることができる。ベースはそのままにして、Master Sniperを10/10にしたらどうなるだろう? Code Base value (1 + 0.0 + .25 * 5) * (1 + 0) = 2.25 Sniper Rank 1 (1 + 1.5 + .35 * 7) * (1 - .5) = 2.475 (10.0% damage increase) Sniper Rank 10 (1 + 1.5 + .35 * 7) * (1 - .23) = 3.8115 (69.4% damage increase) 20スキル・ポイントを費やしても得られるのは+69.4%ダメージ。およそ1ポイントごとに+3.5%の割合だ。 前述のように、ベースのCritical ChanceとCDBが上昇するとSniper/Master Sniperの利点は失われてしまう。それならば、+1% Critical Chance、+100% CDBに設定して、10/10 Master Sniperを見てみよう。 Code Base value (1 + 0.0 + .01 * 1) * (1 + 0) = 1.01 Sniper Rank 1 (1 + 1.5 + .11 * 3) * (1 - .50) = 1.415 (40.1% damage increase) Sniper Rank 10 (1 + 1.5 + .11 * 3) * (1 - .23) = 2.1791 (115.8% damage increase) なんというダメージ増!%値よりも数式のほうに注目してほしい。ベースは+1% Critical Chance、+100% CDBとほんのわずかな数値だ(damage = 1.01)。Sniper系スキル以外で24% Critical Chanceと400% CDB (damage = 2.25)を得られれば、SniperとMaster Sniperに20ポイント振るよりも (damage = 2.18)、ダメージは高い。また、Sniperに1ポイント(damage = 1.255)振っていた場合(もちろんMaster Sniperを取得するために3ポイント必要なのは承知の上だ)、Master Sniperに10ポイント(damage = 1.415)振るよりも、Sniperにさらに9ポイント振り込んでMAX (damage = 1.9327)にした方がよりダメージを稼ぐことが出来る(高Crit Chance/CDB値の場合は、Sniper 10で2.89、Master Sniper 10で2.475)。 以上の結果から、Sniperスキルとhigh-critビルドは相性が良くないということが分かる。 FAQ 1. 上の記事で、ダメージは10%増とあるけれど、数式上では20%増になっているよ。 Originally Posted by ViperFUD Code Base value (1 + 0 + 1 * 1) = 2 20% Divine Mod (1 + .2 + 1 * 1) = 2.2 Modには+20%と表示されてはいても、実際のダメージは+10%しかない。 私がここで述べているのは、Criticalが発動していないときは20%ダメージが増加するが、総合的なADI(一定時間中のダメージ)は10%しか増加していないということだ(2の110% = 2.2)。だから、たとえModに"20%"と表示されていようとも、実際のダメージがどれくらいか把握するためには数式を理解している必要がある。 2. Critical damageの記事を読んだのだけど、2% Critical chance、200% CDB、20% Damage Mod、だけでなく、20% Elemental damage Modを使用した場合も考慮したほうがいいのでは? いい質問だ。以下を見てほしい。 Code Base value (1 + 0) * (1 + .2 + .15 * 2) = 1.5 +2% Critical Chance Mod (1 + 0) * (1 + .2 + .17 * 2) = 1.54 +20% Damage Mod (1 + 0) * (1 + .4 + .15 * 2) = 1.7 +200% CDB Mod (1 + 0) * (1 + .2 + .15 * 4) = 1.8 +20% elemental Mod (1 +.2) * (1 + .2 + .15 * 2) = 1.8 このように20% Elemental damage Modと200% CDB Mod は同値になる。ここで重要なのは、ある程度のCritical Chanceを有している場合(ここでは15%)、Elemental damage Modのほうが"increases damage by" Modよりもダメージが高くなるという点だ。 ------------------------------------------------------------------------------------------------- //※検算してないのでおかしなところが盛りだくさんです。リンク先の数字を追っかけていったほうがいいと思います。 //
https://w.atwiki.jp/v-lyrics/pages/465.html
2009-09-15 First Entry 2009-09-16 14 40 06 (Wed) Last update Trasnlated by damesukekun Title Zinnia Lyric Don t forget the remembrance of yesterday, when we could meet for a while Sorry I m not able to go along the usual road we used to walk together any longer I never meant to leave you behind I m praying that you would still be in happiness there But, possibly, perhaps, I could meet you again someday If the chance should come, I shall overcome all the distance, seasons and set story with full efforts and I will be waiting for you with all, all my yearnings Don t forget the remembrance of yesterday, when we could meet for a while See, return the usual road together that we ll walk someday Comment If you have any advise or opinion for this post please write here.この投稿に対して助言、ご意見などありましたらこちらに書き込んで下さい。 Name Comment すべてのコメントを見る
https://w.atwiki.jp/iwannabethewiki/pages/3313.html
製作者 Ludy DL先↓ http //www.mediafire.com/download/spex0h2xj1pdw5l/My+I+wanna+be+the+guy+Fangame.zip